home *** CD-ROM | disk | FTP | other *** search
/ Micromanía 90 / CDMM_90_1.ISO / Cycling Manager 2 / CyclingManager2Demo.exe / Disk1 / data1.cab / Game / DataCM2 / MenuServer / MenuServer.cnc < prev    next >
Encoding:
Text File  |  2002-05-10  |  15.2 KB  |  372 lines

  1.  
  2. func void LoadDatabase()
  3. {
  4.     println("\tLoading Database : "+ m_szMenuServerDatabase);
  5.     Database_Load( DATABASE_SERVER, m_szMenuServerDatabase );
  6. }
  7.  
  8. func void SaveDatabase()
  9. {
  10.     // debug : special demo
  11.     //Do not save slot in demo version
  12.     if ((!isDemo()) && (DATABASE_SERVER!=0))
  13.     {
  14.         println("MS : Saving database " + m_szMenuServerDatabase);
  15.         Database_Save( DATABASE_SERVER, m_szMenuServerDatabase, 1 );
  16.     }
  17. }
  18.  
  19.  
  20. //***************************************
  21. // * Function : Main
  22. // * 
  23. // * Create the menu server on first free port 
  24. // ***************************************/
  25. func i32x MenuServer_Constructor( i32x _bGateway, szx _szGatewayIP, szx _szDatabase, boolx _bIsNewGame, i32x _iNewGameMode, i32x _iNewStartingDay )
  26. {
  27.     var i32x i;
  28.     var i32x iNumRows;
  29.     var szx szColumnName,szRacer;
  30.  
  31.     print("Starting menu server...\n");
  32.  
  33.     // database
  34.     DATABASE_SERVER = Database_Constructor("ServerDB");
  35.     if (_bIsNewGame)
  36.     {
  37.         m_szMenuServerDatabase = "Database/Database.cdb";
  38.     }
  39.     else
  40.     {    
  41.         m_szMenuServerDatabase = _szDatabase;
  42.     }
  43.     LoadDatabase();
  44.     m_szMenuServerDatabase = _szDatabase;
  45.     Database_BeginSynchronize( DATABASE_SERVER );
  46.  
  47.  
  48.     
  49.     // global joins
  50.     g_stJoins.m_iGame_iMode            = Join_Constructor(DATABASE_SERVER,"GAM_config.fkIDgamemode");
  51.     g_stJoins.m_iGame_iIsOver        = Join_Constructor(DATABASE_SERVER,"GAM_config.game_i_is_over");
  52.     g_stJoins.m_iGame_iNumConnected    = Join_Constructor(DATABASE_SERVER,"GAM_config.temp_i_numconnected");
  53.     g_stJoins.m_iGame_iNumRegistered= Join_Constructor(DATABASE_SERVER,"GAM_config.game_i_numregistered");
  54.  
  55.     g_stJoins.m_iGateway_szIP        = Join_Constructor(DATABASE_SERVER,"GAM_gateway.gene_sz_ip");
  56.     g_stJoins.m_iGateway_szDesc        = Join_Constructor(DATABASE_SERVER,"GAM_gateway.gene_sz_desc");
  57.  
  58.     g_stJoins.m_iUser_iID            = Join_Constructor(DATABASE_SERVER,"GAM_user.IDuser");
  59.     g_stJoins.m_iUser_szLogin        = Join_Constructor(DATABASE_SERVER,"GAM_user.game_sz_login");
  60.  
  61.     
  62.     g_stJoins.m_iUser_iTeamId        = Join_Constructor(DATABASE_SERVER,"GAM_user.fkIDteam_duplicate");
  63.     g_stJoins.m_iTeam_iUserId        = Join_Constructor(DATABASE_SERVER,"DYN_team.fkIDuser_duplicate");
  64.     
  65.  
  66.     g_stJoins.m_iUser_iActive        = Join_Constructor(DATABASE_SERVER,"GAM_user.game_i_active");
  67.     g_stJoins.m_iUser_iLaunchGame    = Join_Constructor(DATABASE_SERVER,"GAM_user.game_i_launch");
  68.     g_stJoins.m_iUser_iState        = Join_Constructor(DATABASE_SERVER,"GAM_user.fkIDuser_state");
  69.     g_stJoins.m_iUser_iConnected    = Join_Constructor(DATABASE_SERVER,"GAM_user.game_i_connected");
  70.     g_stJoins.m_iUser_szPassword    = Join_Constructor(DATABASE_SERVER,"GAM_user.game_sz_authorization");
  71.     g_stJoins.m_iUser_iInRaceReady    = Join_Constructor(DATABASE_SERVER,"GAM_user.temp_i_inrace_ready");
  72.     g_stJoins.m_iUser_iPreRaceTeamId= Join_Constructor(DATABASE_SERVER,"GAM_user.fkIDteam_duplicate.DYN_team.prerace_i_team");
  73.  
  74.     g_stJoins.m_iStage_iWeather        = Join_Constructor(DATABASE_SERVER,"STA_stage.gene_i_weather");
  75.     g_stJoins.m_iStage_iDay            = Join_Constructor(DATABASE_SERVER,"STA_stage.fkIDday");
  76.         
  77.     
  78.     g_stJoins.m_iStaff_iRoleId        = Join_Constructor(DATABASE_SERVER,"DYN_staff.fkIDstaff_role");
  79.     g_stJoins.m_iStaff_iTeamId        = Join_Constructor(DATABASE_SERVER,"DYN_staff.fkIDteam");
  80.  
  81.     // XChange join
  82.     g_stJoins.m_iXChange_iCyclistID            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.fkIDcyclist");
  83.     g_stJoins.m_iXChange_iTeamID            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.fkIDteam");
  84.     g_stJoins.m_iXChange_fInitAmount        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.finan_f_initial_amount");
  85.     g_stJoins.m_iXChange_fAmount            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.finan_f_period_wage");
  86.     g_stJoins.m_iXChange_iDuration            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.finan_i_duration");
  87.     g_stJoins.m_iXChange_iXChangeID            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.IDxchange_cyclist");
  88.     g_stJoins.m_iXChange_fWaiting            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.ia_f_waiting");
  89.     g_stJoins.m_iXChange_iStatusId            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.fkIDstatus_enum");
  90.     g_stJoins.m_iXChange_ifkIDXChangeID        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.fkIDxchange_cyclist");
  91.     g_stJoins.m_iXChange_iSens                = Join_Constructor(DATABASE_SERVER,"DYN_xchange_cyclist.ia_i_sens");
  92.  
  93.     g_stJoins.m_iXChangeSponsor_iSponsorID    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.fkIDsponsor");
  94.     g_stJoins.m_iXChangeSponsor_iTeamID        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.fkIDteam");
  95.     g_stJoins.m_iXChangeSponsor_fInitAmount    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.finan_f_initial_amount");
  96.     g_stJoins.m_iXChangeSponsor_fAmount        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.finan_f_period_amount");
  97.     g_stJoins.m_iXChangeSponsor_iDuration    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.finan_i_duration");
  98.     g_stJoins.m_iXChangeSponsor_iXChangeID    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.IDxchange_sponsor");
  99.     g_stJoins.m_iXChangeSponsor_fWaiting    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.ia_f_waiting");
  100.     g_stJoins.m_iXChangeSponsor_iStatusId    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.fkIDstatus_enum");
  101.     g_stJoins.m_iXChangeSponsor_ifkIDXChangeID= Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.fkIDxchange_sponsor");
  102.     g_stJoins.m_iXChangeSponsor_iSens        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_sponsor.ia_i_sens");
  103.  
  104.     g_stJoins.m_iXChangeLayoff_iCyclistID    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.fkIDcyclist");
  105.     g_stJoins.m_iXChangeLayoff_iTeamID        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.fkIDteam");
  106.     g_stJoins.m_iXChangeLayoff_fInitAmount    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.finan_f_indemnities");
  107.     g_stJoins.m_iXChangeLayoff_iXChangeID    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.IDxchange_layoff");
  108.     g_stJoins.m_iXChangeLayoff_fWaiting        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.ia_f_waiting");
  109.     g_stJoins.m_iXChangeLayoff_iStatusId    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.fkIDstatus_enum");
  110.     g_stJoins.m_iXChangeLayoff_ifkIDXChangeID= Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.fkIDxchange_layoff");
  111.     g_stJoins.m_iXChangeLayoff_iSens        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_layoff.ia_i_sens");
  112.  
  113.     g_stJoins.m_iXChangeTransfert_iCyclistID    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.fkIDcyclist");
  114.     g_stJoins.m_iXChangeTransfert_iTeamID        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.fkIDteam");
  115.     g_stJoins.m_iXChangeTransfert_fInitAmount    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.finan_f_period_amount");
  116.     g_stJoins.m_iXChangeTransfert_iXChangeID    = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.IDxchange_transfert");
  117.     g_stJoins.m_iXChangeTransfert_fWaiting        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.ia_f_waiting");
  118.     g_stJoins.m_iXChangeTransfert_iStatusId        = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.fkIDstatus_enum");
  119.     g_stJoins.m_iXChangeTransfert_ifkIDXChangeID= Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.fkIDxchange_transfert");
  120.     g_stJoins.m_iXChangeTransfert_iSens            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.ia_i_sens");
  121.     g_stJoins.m_iXChangeTransfert_iLast            = Join_Constructor(DATABASE_SERVER,"DYN_xchange_transfert.gene_b_last");
  122.  
  123.     g_stJoins.m_iTeam_iId                = Join_Constructor(DATABASE_SERVER,"DYN_team.IDteam");
  124.     g_stJoins.m_iTeam_iInviteEnum        = Join_Constructor(DATABASE_SERVER,"DYN_team.game_i_invite_enum");
  125.     g_stJoins.m_iTeam_szAbrev            = Join_Constructor(DATABASE_SERVER,"DYN_team.gene_sz_abbreviation");
  126.     g_stJoins.m_iTeam_szName            = Join_Constructor(DATABASE_SERVER,"DYN_team.gene_sz_name");
  127.  
  128.     g_stJoins.m_iCyclist_iId            = Join_Constructor(DATABASE_SERVER,"DYN_cyclist.IDcyclist");
  129.     g_stJoins.m_iCyclist_szFirstName    = Join_Constructor(DATABASE_SERVER,"DYN_cyclist.fkIDcharacteristic.DYN_characteristic.civic_sz_firstname");
  130.     g_stJoins.m_iCyclist_szLastName        = Join_Constructor(DATABASE_SERVER,"DYN_cyclist.fkIDcharacteristic.DYN_characteristic.civic_sz_lastname");
  131.     g_stJoins.m_iCyclist_iTeamId        = Join_Constructor(DATABASE_SERVER,"DYN_cyclist.fkIDteam");
  132.     g_stJoins.m_iCyclist_iPreRaceIndex    = Join_Constructor(DATABASE_SERVER,"DYN_cyclist.prerace_i_cyclist");
  133.     g_stJoins.m_iCyclist_iWithdrawal    = Join_Constructor(DATABASE_SERVER,"DYN_cyclist.race_b_withdrawal");
  134.     
  135.  
  136.     i=0;
  137.     szRacer = "DYN_team.fkIDcyclist_";
  138.     //szColumnName = "DYN_team.fkIDcurrent_tactic_";
  139.     while(i<9)
  140.     {
  141.         g_stJoins.m_iTeam_iRacerId[i] = Join_Constructor(DATABASE_SERVER,strcat(szRacer,itoa(i+1)));
  142.         //g_stJoins.m_iTeam_iTacticId[i] = Join_Constructor(DATABASE_SERVER,strcat(szColumnName,itoa(i+1)));
  143.         i=i+1;
  144.     }
  145.     
  146.  
  147.     
  148.     // init user state
  149.     i=0;
  150.     iNumRows = Join_GetNumRows(g_stJoins.m_iUser_iInRaceReady);
  151.     while (i<iNumRows)
  152.     {
  153.         Join_SetIntFromIndex(g_stJoins.m_iUser_iInRaceReady, i, 0);
  154.         Join_SetIntFromIndex(g_stJoins.m_iUser_iLaunchGame, i, 0);
  155.         Join_SetIntFromIndex(g_stJoins.m_iUser_iState, i, 1); // Set wait mode
  156.         Join_SetIntFromIndex(g_stJoins.m_iUser_iConnected, i, 0);
  157.         i=i+1;
  158.     }
  159.  
  160.  
  161.     // num connected
  162.     Join_SetIntFromIndex( g_stJoins.m_iGame_iNumConnected, 0, 0 );
  163.  
  164.     // init db for first launch
  165.     if (_bIsNewGame==1)
  166.     {
  167.         // Init db Weather
  168.         i=0;
  169.         iNumRows = Join_GetNumRows(g_stJoins.m_iStage_iWeather);
  170.         while (i<iNumRows)
  171.         {
  172.             Join_SetIntFromIndex(g_stJoins.m_iStage_iWeather, i, g_iWEATHER_NotInit);
  173.             i = i+1;
  174.         }    
  175.  
  176.         // Save game mode in db
  177.         Join_SetIntFromIndex(g_stJoins.m_iGame_iMode,0,_iNewGameMode);
  178.  
  179.         // reset game over in db
  180.         Join_SetIntFromIndex(g_stJoins.m_iGame_iIsOver,0,0);
  181.  
  182.         //  Save starting day in db
  183.         Database_SetIntData( DATABASE_SERVER, "GAM_config.fkIDday", ROW_INDEX ,0, _iNewStartingDay );
  184.     }
  185.  
  186.  
  187.  
  188.     // set Game mode from DB
  189.     SetGameMode(Join_GetIntFromIndex(g_stJoins.m_iGame_iMode,0));
  190.  
  191.     
  192.  
  193.  
  194.  
  195.     // Create ancestor component
  196.     g_pAncestorComponent = NewObject(iAncestorInterface);
  197.  
  198.     // Set this object as first of all
  199.     if (!g_gcManager)
  200.     {
  201.         g_gcManager = g_pAncestorComponent;
  202.         ManagerComponent(g_pAncestorComponent);
  203.     }
  204.     else
  205.     {
  206.         MountComponent(g_gcManager,g_pAncestorComponent);
  207.     }
  208.  
  209.     // create server
  210.     g_pServer=NetServer_Create(g_iServerPort,g_pAncestorComponent);
  211.     if (g_pServer)
  212.     {
  213.         // Read the server port
  214.         g_iServerPort = NetServer_GetPort(g_pServer);
  215.  
  216.         println("--- Server Online on port " + itoa(g_iServerPort));
  217.     }
  218.  
  219.     // connect to gateway
  220.     if (_bGateway)
  221.     {
  222.         // create alive gateway timer
  223.         g_iAliveTimer = CreateTimer( g_fAliveTime, fnUpdateAlive, 1);
  224.         
  225.         // create udp gateway client
  226.         g_pGatewayUDPClient = NetUDPClient_Constructor( _szGatewayIP, g_iGatewayAlivePort );
  227.  
  228.         // first update
  229.         fnUpdateAlive();
  230.     }
  231.  
  232.     // init phase/day callback
  233.     SetStopRaceFunc(NotifyRaceStop);
  234.  
  235.  
  236.     print("ok\n");
  237.  
  238.     return DATABASE_SERVER;
  239. }
  240.  
  241.  
  242.  
  243.  
  244. func void MenuServer_Destructor()
  245. {
  246.     var i32x i;
  247.  
  248.     print("stopping menu server..\n");
  249.     
  250.     // save database
  251.     SaveDatabase();
  252.     
  253.     // destroy server
  254.     if (g_pServer)
  255.         NetServer_Destroy(g_pServer);
  256.     g_pServer = G_pNullServer;
  257.  
  258.     // delete udp client gateway
  259.     if (g_pGatewayUDPClient)
  260.         NetUDPClient_Destructor(g_pGatewayUDPClient);
  261.     g_pGatewayUDPClient = g_pNullUDPClient;
  262.  
  263.     // destroy  gateway timer
  264.     if (g_iAliveTimer)
  265.         DestroyTimer(g_iAliveTimer);
  266.     g_iAliveTimer = 0;
  267.  
  268.     // destroy joins
  269.     if (g_stJoins.m_iUser_szLogin)
  270.     {
  271.         Join_Destructor(g_stJoins.m_iGateway_szIP);
  272.         Join_Destructor(g_stJoins.m_iGateway_szDesc);
  273.  
  274.         Join_Destructor(g_stJoins.m_iGame_iIsOver);
  275.         Join_Destructor(g_stJoins.m_iGame_iNumConnected);
  276.         Join_Destructor(g_stJoins.m_iGame_iNumRegistered);
  277.         Join_Destructor(g_stJoins.m_iGame_iMode);
  278.  
  279.         Join_Destructor(g_stJoins.m_iUser_iID);
  280.         Join_Destructor(g_stJoins.m_iUser_szLogin);
  281.  
  282.         Join_Destructor(g_stJoins.m_iUser_iTeamId);
  283.         Join_Destructor(g_stJoins.m_iTeam_iUserId);
  284.  
  285.  
  286.         Join_Destructor(g_stJoins.m_iUser_iActive);
  287.         Join_Destructor(g_stJoins.m_iUser_iLaunchGame);
  288.         Join_Destructor(g_stJoins.m_iUser_iState);
  289.         Join_Destructor(g_stJoins.m_iUser_iConnected);
  290.         Join_Destructor(g_stJoins.m_iUser_iInRaceReady);
  291.         Join_Destructor(g_stJoins.m_iUser_iPreRaceTeamId);
  292.         Join_Destructor(g_stJoins.m_iUser_szPassword);
  293.  
  294.         i=0;
  295.         while(i<9)
  296.         {
  297.             Join_Destructor(g_stJoins.m_iTeam_iRacerId[i]);
  298.             //Join_Destructor(g_stJoins.m_iTeam_iTacticId[i]);
  299.             i=i+1;
  300.         }
  301.         Join_Destructor(g_stJoins.m_iTeam_iId);
  302.         Join_Destructor(g_stJoins.m_iTeam_iInviteEnum);
  303.         Join_Destructor(g_stJoins.m_iCyclist_iId);
  304.         Join_Destructor(g_stJoins.m_iCyclist_szFirstName);
  305.         Join_Destructor(g_stJoins.m_iCyclist_szLastName);
  306.         Join_Destructor(g_stJoins.m_iCyclist_iTeamId);
  307.         Join_Destructor(g_stJoins.m_iCyclist_iPreRaceIndex);
  308.         Join_Destructor(g_stJoins.m_iCyclist_iWithdrawal);
  309.  
  310.         // XChange join
  311.         Join_Destructor(g_stJoins.m_iXChange_iCyclistID);
  312.         Join_Destructor(g_stJoins.m_iXChange_iTeamID);
  313.         Join_Destructor(g_stJoins.m_iXChange_fInitAmount);
  314.         Join_Destructor(g_stJoins.m_iXChange_fAmount);
  315.         Join_Destructor(g_stJoins.m_iXChange_iDuration);
  316.         Join_Destructor(g_stJoins.m_iXChange_iXChangeID);
  317.         Join_Destructor(g_stJoins.m_iXChange_fWaiting);
  318.         Join_Destructor(g_stJoins.m_iXChange_iStatusId);
  319.         Join_Destructor(g_stJoins.m_iXChange_ifkIDXChangeID);
  320.         Join_Destructor(g_stJoins.m_iXChange_iSens);
  321.  
  322.         Join_Destructor(g_stJoins.m_iXChangeSponsor_iSponsorID);
  323.         Join_Destructor(g_stJoins.m_iXChangeSponsor_iTeamID);
  324.         Join_Destructor(g_stJoins.m_iXChangeSponsor_fInitAmount);
  325.         Join_Destructor(g_stJoins.m_iXChangeSponsor_fAmount);
  326.         Join_Destructor(g_stJoins.m_iXChangeSponsor_iDuration);
  327.         Join_Destructor(g_stJoins.m_iXChangeSponsor_iXChangeID);
  328.         Join_Destructor(g_stJoins.m_iXChangeSponsor_fWaiting);
  329.         Join_Destructor(g_stJoins.m_iXChangeSponsor_iStatusId);
  330.         Join_Destructor(g_stJoins.m_iXChangeSponsor_ifkIDXChangeID);
  331.         Join_Destructor(g_stJoins.m_iXChangeSponsor_iSens);
  332.  
  333.         Join_Destructor(g_stJoins.m_iXChangeLayoff_iCyclistID);
  334.         Join_Destructor(g_stJoins.m_iXChangeLayoff_iTeamID);
  335.         Join_Destructor(g_stJoins.m_iXChangeLayoff_fInitAmount);
  336.         Join_Destructor(g_stJoins.m_iXChangeLayoff_iXChangeID);
  337.         Join_Destructor(g_stJoins.m_iXChangeLayoff_fWaiting);
  338.         Join_Destructor(g_stJoins.m_iXChangeLayoff_iStatusId);
  339.         Join_Destructor(g_stJoins.m_iXChangeLayoff_ifkIDXChangeID);
  340.         Join_Destructor(g_stJoins.m_iXChangeLayoff_iSens);
  341.  
  342.         Join_Destructor(g_stJoins.m_iXChangeTransfert_iCyclistID);
  343.         Join_Destructor(g_stJoins.m_iXChangeTransfert_iTeamID);
  344.         Join_Destructor(g_stJoins.m_iXChangeTransfert_fInitAmount);
  345.         Join_Destructor(g_stJoins.m_iXChangeTransfert_iXChangeID);
  346.         Join_Destructor(g_stJoins.m_iXChangeTransfert_fWaiting);
  347.         Join_Destructor(g_stJoins.m_iXChangeTransfert_iStatusId);
  348.         Join_Destructor(g_stJoins.m_iXChangeTransfert_ifkIDXChangeID);
  349.         Join_Destructor(g_stJoins.m_iXChangeTransfert_iSens);
  350.         Join_Destructor(g_stJoins.m_iXChangeTransfert_iLast);
  351.  
  352.  
  353.  
  354.         Join_Destructor(g_stJoins.m_iStage_iWeather);
  355.         Join_Destructor(g_stJoins.m_iStage_iDay);
  356.  
  357.         Join_Destructor(g_stJoins.m_iTeam_szName);
  358.         Join_Destructor(g_stJoins.m_iTeam_szAbrev);
  359.  
  360.         Join_Destructor(g_stJoins.m_iStaff_iRoleId);
  361.         Join_Destructor(g_stJoins.m_iStaff_iTeamId);
  362.     }
  363.  
  364.     // destroy database
  365.     if (DATABASE_SERVER)
  366.         Database_Destructor( DATABASE_SERVER );
  367.     DATABASE_SERVER = 0;
  368.  
  369.     print("ok.\n");
  370. }
  371.  
  372.